package com.example.function.integration.config;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;

import java.util.concurrent.TimeUnit;

/**
 * @Description：全局本地缓存配置类 应用停掉之后，全局缓存失效，应用重启之后需要重新将数据库中的数据加载进缓存
 * @Author： fengcheng
 * @Date： 2024/10/11 15:44
 */
public class GlobalLocalCacheConfig {

    /**
     * Caffeine 是基于Java 1.8的高性能本地缓存库，支持并发, 指定过期策略，指定缓存容量
     * expireAfterWrite：第一次写后一段时间过期：例如，设置5分钟后过期，第一次写入时间为15：00，在此期间无论对缓存多少次读操作，缓存都会在15：05过期。
     * expireAfterAccess：读后过一段时间过期，如果这段时间内再次读，那么重新开始计算时间：例如，设置读时间5分钟后过期，第一次写入时间为15:00，若之后未对该缓存进行任何读操作，那它就会在15:05过期；假设在15:02对该缓存进行了一次读操作，并且后续没有任何读操作，那么它将在15:07过期。
     */
    public static final Cache<String, Object> globalCache = Caffeine.newBuilder().expireAfterAccess(10, TimeUnit.MINUTES).maximumSize(1000).build();

    /**
     * 将键值对放入缓存，设置过期时间。
     *
     * @param key   缓存键
     * @param value 缓存值
     */
    public static void put(String key, Object value) {
        globalCache.put(key, value);
    }

    /**
     * 从缓存中获取值，如果不存在则返回null。
     *
     * @param key 缓存键
     * @return 缓存值
     */
    public static Object get(String key) {
        return globalCache.getIfPresent(key);
    }

    /**
     * 移除缓存中的键值对。
     *
     * @param key 缓存键
     */
    public static void remove(String key) {
        globalCache.invalidate(key);
    }
}
